package profile.utils

/**
  * Created by hunter.coder 涛哥  
  * 2019/4/24 15:05
  * 交流qq:657270652
  * Version: 1.0
  * 更多学习资料：https://blog.csdn.net/coderblack/
  * Description:  T-1日标签  和  T日标签合并： 同现累加，缺失衰减
  **/
object TagMergeUtil {

  /**
    * 合并两个map，相同key的value累加
    * @param tagMap1 待合并标签map1
    * @param tagMap2 待合并标签map2
    * @param d_ratio 衰减因子
    * @return
    */
  def mergeReductionMap(m1: Map[String, Double], m2: Map[String, Double],d_ratio:Double): Map[String, Double] = {

    val deductionedM1 = m1.--(m2.keySet).map { case (k, v) => (k, v * d_ratio) }

    ((m1 ++ deductionedM1) /: m2) {
      case (map, (k, v)) =>
        map + (k -> (v + map.getOrElse(k, 0d)))
    }
  }

  /**
    *  合并两个标签模块（嵌套map）
    * @param oldTags  T-1日标签
    * @param newTags  T日标签
    * @param d_ratio  衰减因子
    * @return
    */
  def mergeReductionTagMap(oldTags: Map[String, Map[String, Double]], newTags: Map[String, Map[String, Double]],d_ratio:Double): Map[String, Map[String, Double]] = {

    /**
      * 老-新 标签模块合并，需要考虑两种情况：
      * 1.老模块中存在的标签，在新模块中不存在，则这些标签的分数要衰减
      * 2.除此以外，则是将新模块中的标签往老模块中叠加
      */
    // 衰减 老 模块中有  而 新模块中 没有的 标签子类别
    val deductionedOldTags = oldTags.--(newTags.keySet).mapValues(m => m.mapValues(_ * d_ratio).map(x=>x))

    ((oldTags ++ deductionedOldTags) /: newTags) {
      case (sumMap, (k, v)) => {
        if (sumMap.get(k).isDefined) {
          val m1 = sumMap.get(k).get
          sumMap + (k -> mergeReductionMap(m1, v,d_ratio))
        } else {
          sumMap + (k -> v)
        }

      }
    }
  }


  /**
    * 测试
    * @param args
    */
  def main(args: Array[String]): Unit = {
    val tm1 = Map("imei" -> Map("imei012" -> 5.0, "imei011" -> 2.0), "idfa" -> Map("idfa02" -> 4.0), "androidid" -> Map("androidid02" -> 4.0, "androidid01" -> 1.0))
    val tm2 = Map("imei" -> Map("imei012" -> 3.0), "phone" -> Map("13667568" -> 2.0))

    println(mergeReductionTagMap(tm1, tm2,0.8))

    println()
  }
}
